package handler;

import pojo.Student;

import java.sql.*;
import java.util.List;
/** 数据库操作相关*/
public class DatabaseHandler {
    Connection con;
    String driver="com.mysql.cj.jdbc.Driver";
    String url="jdbc:mysql://localhost:3306/test";
    String user="root";
    String password="159765";
    /** 数据库操作构造方法，用于加载数据库驱动和连接数据库*/
    public DatabaseHandler()  {
        try {
            Class.forName(driver);/** 加载驱动*/
            con = DriverManager.getConnection(url, user, password);/** 创建数据库链接*/
            Statement statement = con.createStatement();/** 创建SQL语句对象*/
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动没有安装");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /** 用于插入学生信息*/
    public int insertClassScore(List<Student> list){
        int row=0;/** 用来记录插入行数*/
        int i,len;
        PreparedStatement prep =null;/** 创建预编译语句队形啊*/
        len=list.size();
        for(i=0;i<len;i++)
        {
            Student stu=list.get(i);/** 将学生信息取出*/
            String clas=stu.getClass1();
            String sname= stu.getName();
            String gra=stu.getGrade();
            try {
                prep=con.prepareStatement("insert into classstudentscore values(?,?,?)");/** 插入指令*/
                prep.setString(1,clas);/** 设置第一个位置的值为String类型的班级名称*/
                prep.setString(2,sname);/** 设置第二个位置的值为String类型的学生名称*/
                prep.setString(3,gra);/** 设置第一个位置的值为String类型的学生成绩*/
                if(prep.execute())/** 将sql语句执行，如果成功就使插入行数加一*/
                    row++;
                else
                    row=0;/** 否则使插入行数为0，这样就能让返回的行数值为0*/
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        return row;/** 返回插入行*/
    }
    /** 获取最高成绩*/
    public double getmax(){
        double dbmax=0;
        try {
            String  sql="select max(score) as dbmax from classstudentscore";/** 查询学生成绩中最大值*/
            Statement statement = con.createStatement();/** 创建执行语句*/
            ResultSet resultSet=statement.executeQuery(sql);/** 用于接受返回集*/
            resultSet.next();
            dbmax = resultSet.getDouble("dbmax");
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return dbmax;
    }
    /** 重置数据库*/
    public boolean renewall(){
        int flag=0;
        PreparedStatement prep =null;
        try {
            prep=con.prepareStatement("drop table classaveragescore");
            if(prep.execute()==false)
                flag++;
            prep=con.prepareStatement("drop table classstudentscore;");/** 通过删除表然后重新创建表来实现清空数据库*/
            if(prep.execute()==false)
                flag++;
            prep=con.prepareStatement("CREATE TABLE classStudentScore(\n" +
                    "                                  className varchar(20) NOT NULL  ,\n" +
                    "                                  sname varchar(20) NOT NULL ,\n" +
                    "                                  score decimal(4,2) NOT NULL\n" +
                    ");");
            if(prep.execute()==false)
                flag++;
            prep=con.prepareStatement("CREATE TABLE classAverageScore(\n" +
                    "                                  className varchar(20) primary key NOT NULL,\n" +
                    "                                  averageScore decimal(4,2) NOT NULL\n" +
                    ");");
            if(prep.execute()==false)
                flag++;
        }catch (SQLException e){
            e.printStackTrace();
        }
        System.out.println(flag);
        if(flag==4)
            return true;
        else
            return false;
    }
    /** 插入班级平均成绩*/
    public int insertAverageScore(){
        int row=0;
        PreparedStatement prep =null;
        try {
            String  sql="select className, avg(score) as avgra from classstudentscore group by className";/** 返回集为班级名称以及班级平均成绩*/
            Statement statement = con.createStatement();
            ResultSet resultSet=statement.executeQuery(sql);/** 接收返回集*/
            String name;
            double avgra;
            while (resultSet.next()) {
                name = resultSet.getString("className");/** 班级名称*/
                avgra = resultSet.getDouble("avgra");/** 班级平均成绩*/
                prep=con.prepareStatement("insert into classaveragescore values(?,?)");
                prep.setString(1,name);
                prep.setDouble(2,avgra);
                if(prep.execute())/** 执行语句*/
                    row++;
                else
                    row=0;
            }
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return row;
    }
    /** 查询所有班级平均成绩*/
    public double queryAverage(){
        double avgra=0;
        try {
            String  sql="select avg(averageScore) as avgra from classaveragescore";
            Statement statement = con.createStatement();
            ResultSet resultSet=statement.executeQuery(sql);
            resultSet.next();
            avgra = resultSet.getDouble("avgra");
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return avgra;/** 返回查询结果*/
    }
}
